package com.study.decorator;

/**
 * 装饰者模式
 * 在不改变原有对象的基础上,将功能附加在对象上
 * 符合开闭原则,再不改变代码的情况下给一个对象拓展功能
 * 可以灵活组合实现不同的增强功能跟增强顺序
 *
 * 比如正常的相机只能拍照 我们要给相机在基础功能上 再增加美颜 滤镜的效果
 */
public class DecoratorTest {
    public static void main(String[] args) {

        //自由组合的包装就能实现不同的增强
        Camera camera = new MeiyanCamera( new DefaultCamera() ) ;
        camera.operation();

        Camera camera2 = new LvjingCamera(new DefaultCamera());
        camera2.operation();

        Camera camera3 = new LvjingCamera(new MeiyanCamera( new DefaultCamera() ))  ;
        camera3.operation();

    }
}

//操作接口
interface Camera{
    void operation();
}

//基本相机
class DefaultCamera implements Camera{
    @Override
    public void operation() {
        System.out.println("拍照");
    }
}

//装饰者
abstract class Decorator implements Camera{
    Camera camera ;
    public Decorator(Camera camera) {
        this.camera = camera;
    }
}

class MeiyanCamera extends Decorator{

    public MeiyanCamera(Camera camera) {
        super(camera);
    }

    @Override
    public void operation() {
        //增强方法
        System.out.println("添加美颜效果");
        //原先目标方法
        camera.operation();
    }

}

class LvjingCamera extends Decorator{

    public LvjingCamera(Camera camera) {
        super(camera);
    }

    @Override
    public void operation() {
        //增强方法
        System.out.println("添加滤镜效果");
        //原先目标方法
        camera.operation();
    }

}